package aidn.animation.controller 
{
	import aidn.animation.utils.Utils;
	import flash.display.*;
	import flash.events.Event;
	import flash.geom.Point;
	import flash.utils.*;
	
	/**
	 * 
	 */
	public class MovieClipManager
	{
		// [Methods]
		// 
		// MovieClipManager ( pts :/*Point*/Array = null, tts :/*Number*/Array = null ) 
		// 
		// setPts ( pts :/*Point*/Array = null )
		// addPts ( pts :/*Point*/Array ) 
		// setTts ( tts :/*Number*/Array = null ) 
		// addTts ( tts :/*Number*/Array ) 
		// setClass ( classes :/*Class*/Array )
		// addClass ( classes :/*Class*/Array )
		// 
		// start ( num :int = 10, interval :int = -1 )
		// 
		// setStageSize ( w :int, h :int )
		// setTarget ( target :DisplayObjectContainer )
		
		
		private var ClassList :/*Class*/Array
		
		private var _stw :int = 640;
		private var _sth :int = 480;
		
		private var _pts :/*Point*/Array;
		private var _now :int;				// 今のカウント
		
		private var _num :int;				// 1 frame あたりの個数
		
		private var _type :int;				// "point", "random"
		private var _target :DisplayObjectContainer;	// addChlid する対象
		
		private var _count    :int;
		private var _interval :int;			// MC を生成する間隔
		
		private var _flag :Boolean;			// fales: _tts 未使用,  true: _tts 使用
		private var _tts :/*Number*/Array;
		private var _startTime :uint;
		
		
		
		public function MovieClipManager ( pts :/*Point*/Array = null, tts :/*Number*/Array = null ) 
		{
			ClassList = [];
			
			setPts( pts );
			setTts( tts );
		}
		
		/**
		 * 位置(Point)配列をセットします。
		 * @param	pts
		 */
		public function setPts ( pts :/*Point*/Array = null ) :void 
		{
			if ( pts )
			{
				if ( pts[0] is Point )	_pts = pts;
				else					_pts = Utils.numToPts( pts );
			}
			else _type = 1;
		}
		/**
		 * 位置(Point)配列を追加します。
		 * @param	pts
		 */
		public function addPts ( pts :/*Point*/Array ) :void 
		{
			if ( pts[0] is Point )	_pts = _pts.concat( pts );
			else					_pts = _pts.concat( Utils.numToPts( pts ) );
		}
		
		/**
		 * 時間(単位:ms)配列をセットします。
		 * @param	tts
		 */
		public function setTts ( tts :/*Number*/Array = null ) :void 
		{
			if ( tts )	_tts = tts;
			else		_flag = false;
		}
		/**
		 * 時間(単位:ms)配列を追加します。
		 * @param	tts
		 */
		public function addTts ( tts :/*Number*/Array ) :void 
		{
			_tts = _tts.concat( tts );
		}
		
		/**
		 * クラス(MovieClip)配列をセットします(フレームの最後で破棄されるもの)。
		 * @param	classes
		 */
		public function setClass ( classes :/*Class*/Array ) :void
		{
			var len :uint = classes.length;
			
			ClassList = [];
			for ( var i :int = 0; i < len; i ++ ) ClassList.push( classes[i] );
		}
		/**
		 * クラス(MovieClip)配列を追加します。
		 * @param	classes
		 */
		public function addClass ( classes :/*Class*/Array ) :void
		{
			var len :uint = classes.length;
			for ( var i :int = 0; i < len; i ++ ) ClassList.push( classes[i] );
		}
		
		/**
		 * 開始します。
		 * @param	num			1回に生成する個数。
		 * @param	interval	生成フレーム間隔(0以下のときはtts使用モード)。
		 */
		public function start ( num :int = 10, interval :int = -1 ) :void
		{
			_now = 0;
			_num = num;
			_startTime = getTimer();
			
			_count    = 0;
			_interval = interval;
			if (interval <= 0) _flag = true;
			
			_target.removeEventListener( Event.ENTER_FRAME, _enterFrameHandler );
			_target.addEventListener( Event.ENTER_FRAME,    _enterFrameHandler );
		}
		
		/**
		 * ステージサイズをセットします。
		 * @param	w	stageWidth
		 * @param	h	stageHeight
		 */
		public function setStageSize ( w :int, h :int ) :void
		{
			_stw = w;
			_sth = h;
		}
		/**
		 * addChild する対象をセットします。
		 * @param	target
		 */
		public function setTarget ( target :DisplayObjectContainer ) :void
		{
			_target = target;
		}
		
		
		
		/* ENTER FRAME */
		private function _enterFrameHandler ( evt :Event ) :void
		{
			if ( ! _flag )	_updateInterval();
			else			_updateTime();
		}
		private function _updateInterval ( ) :void
		{
			var i :int;
			var px :int, py :int;
			
			if ( _count % _interval == 0 )	// _interval フレーム毎に生成
			{
				switch ( _type )
				{
				case 0:								//// point
					
					if ( _now < _pts.length )
					{
						px = _pts[_now].x;
						py = _pts[_now].y;
						
						for ( i = 0; i < _num; i ++ )
							_create( px + Utils.rand( -100, 100), py + Utils.rand( -100, 100),
									 Utils.rand(0.5, 2), Utils.rand(0, 360) );
					}
					else	_target.removeEventListener( Event.ENTER_FRAME, _enterFrameHandler );
					_now ++;
					
					break;
				case 1:								//// 完全 random
					
					for ( i = 0; i < _num; i ++ )
							_create( Utils.rand(  0, _stw), Utils.rand(0, _sth),
									 Utils.rand(0.5,    2), Utils.rand(0,  360) );
					break;
				}
			
			}
			_count ++;
		}
		private function _updateTime ( ) :void
		{
			var i :int;
			var px :int, py :int;
			
			if ( _now < _tts.length )
			{
				// 時間が上回ったら、生成
				if ( _tts[_now] < getTimer() - _startTime )
				{
					switch ( _type )
					{
					case 0:								//// point
						if ( _now < _pts.length )
						{
							px = _pts[_now].x;
							py = _pts[_now].y;
							
							for ( i = 0; i < _num; i ++ )
								_create( px + Utils.rand( -100, 100), py + Utils.rand( -100, 100),
										 Utils.rand(0.5, 2), Utils.rand(0, 360) );
						}
						break;
					case 1:								//// 完全 random
						for ( i = 0; i < _num; i ++ )
								_create( Utils.rand(  0, _stw), Utils.rand(0, _sth),
										 Utils.rand(0.5,    2), Utils.rand(0,  360) );
						break;
					}
					
					_now ++;
				}
			}
			else	_target.removeEventListener( Event.ENTER_FRAME, _enterFrameHandler );
		}
		
		private function _create ( px :int, py :int, scale :Number = 1, rotation :int = 0 ) :void
		{
			var r :int = Math.floor(Math.random() * ClassList.length);
			var m :MovieClip = new ClassList[r]() as MovieClip;
			
			m.x = px;
			m.y = py;
			
			m.rotation = rotation;
			m.scaleX = m.scaleY = scale;
			
			if ( _target )	_target.addChild( m );
			else			addChild( m );
		}
	}
}